package com.lujieni.springbootmapconstructor.mapper;

import com.lujieni.springbootmapconstructor.dto.UserDO;
import com.lujieni.springbootmapconstructor.dto.UserDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * @Author：Jie Ni
 * @Date: 2025/7/8 17:43
 * @Description:
 *
 * MapStruct会在编译时自动生成 UserConvert的实现类(如 UserConvertImpl),而getMapper()方法返回的就是这个生成的实例
 * uses的作用就是告诉MapStruct:在转换对象时,如果遇到嵌套对象,请使用我指定的这些Mapper来处理。
 */
@Mapper(uses = HobbyConvert.class)
public interface UserConvert {
    /**
     * Mappers.getMapper(UserConvert.class) 是 MapStruct 提供的静态方法,
     * 用于获取 UserConvert 接口的实现类实例。
     */
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

    // 时间字段的转换 Date -> String
    @Mapping(source = "createTime", target = "formattedDate", dateFormat = "yyyy-MM-dd HH:mm:ss")
    // 字段类型一致,名字不同的处理
    @Mapping(source = "username", target = "name")
    // 对于嵌套对象类型一致名字不同的处理
    @Mapping(source = "hobby", target = "hobbyDTO")
    UserDTO toDto(UserDO user);

    @Mapping(source = "formattedDate", target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Mapping(source = "name", target = "username")
    UserDO toEntity(UserDTO dto);

    /**
     * MapStruct会自动查找合适的单个元素映射方法,这里就会找到toDto方法!!!!!!!!!!!!!!!!!!!!!!!!!!!
     * 所以对于字段映射的注解不要加在toDtoList上,而是加在toDto上才有效
     * @param list
     * @return
     */
    List<UserDTO> toDtoList(List<UserDO>list);


}
